package pl.edu.pk.psb.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pl.edu.pk.psb.assembler.UzytkownikCommandAssembler;
import pl.edu.pk.psb.bc.bo.UzytkownikBo;
import pl.edu.pk.psb.bc.bo.WydarzenieBo;
import pl.edu.pk.psb.bc.dto.RezerwacjaDto;
import pl.edu.pk.psb.bc.dto.UzytkownikDto;
import pl.edu.pk.psb.bc.util.TypUzytkownika;
import pl.edu.pk.psb.command.UzytkownikCommand;
import pl.edu.pk.psb.validator.UzytkownikValidator;

@Controller
public class RejestracjaController {
	@Autowired
	UzytkownikCommandAssembler assembler;

	@Autowired
	UzytkownikBo uzytkownikBo;

	@Autowired
	UzytkownikValidator uzytkownikWalidator;
	
	@Autowired
	WydarzenieBo wydarzenieBo;

	@ModelAttribute("command")
	public UzytkownikCommand stworzRejestracjaCommand() {
		return new UzytkownikCommand();
	}

	@RequestMapping("/rejestracja")
	public ModelAndView przekierujDoRejestracji() {
		return new ModelAndView("rejestracja");
	}
	
	@RequestMapping("/pokazProfil")
	public ModelAndView edytujProfil(@ModelAttribute("command") UzytkownikCommand command, @RequestParam int id, HttpSession sesja) {
		Map<String, Object> model = new HashMap<String, Object>();
		assembler.konwertuj(uzytkownikBo.pobierzUzytkownika(id), command);
		Set<RezerwacjaDto> rezerwacje = ((UzytkownikDto)sesja.getAttribute("uzytkownik")).getRezerwacje();
		rezerwacje = wydarzenieBo.uzupelnijRezerwacjeOWydarzenie(rezerwacje);
		model.put("rezerwacje", rezerwacje);
		return new ModelAndView("rejestracja", model);
	}

	@RequestMapping("/zarejestruj")
	public ModelAndView zarejestrujUzytkownika(@ModelAttribute("command") UzytkownikCommand command, BindingResult wynik, HttpSession sesja) {
		uzytkownikWalidator.validate(command, wynik);
		if (wynik.hasErrors()) {
			if(command.getId()!=null){
				Map<String, Object> model = new HashMap<String, Object>();
				Set<RezerwacjaDto> rezerwacje = ((UzytkownikDto)sesja.getAttribute("uzytkownik")).getRezerwacje();
				rezerwacje = wydarzenieBo.uzupelnijRezerwacjeOWydarzenie(rezerwacje);
				model.put("rezerwacje", rezerwacje);
				return new ModelAndView("rejestracja", model);
			}
			return new ModelAndView("rejestracja");
		}
		UzytkownikDto uzytkownik = assembler.konwertuj(command);
		uzytkownik.setDataRejestracji(new Date());
		uzytkownik.setTyp(TypUzytkownika.UZYTKOWNIK);
		uzytkownikBo.zarejestruj(uzytkownik);
		sesja.setAttribute("wiadomosc", "rejestracja.potwierdzenie");
		return new ModelAndView("redirect:/glowna");
	}
}
